home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / gui / gui4cli.lha / Gui4Cli / Ext / Exmpl_src / 1_GCTalk / GCTalk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-29  |  3.5 KB  |  125 lines

  1. /****************************************************************
  2. **
  3. **    GCTalk.c by dck@hol.gr
  4. **
  5. **    This little program is to show you how to talk to 
  6. **    Gui4Cli. All it does is to get a lock on the main
  7. **    Gui4Cli structure and print out the names of all
  8. **    the currently loaded guis and then a simple command 
  9. **    to Gui4Cli for execution.
  10. **
  11. **    There is an other version of this called GCTalkNS.c
  12. **    (in this dir) which uses the SAS "nostartup" option 
  13. **    to produce an even smaller executable.
  14. **
  15. ******************************************************************/
  16. // some of these may not be needed..
  17. #include <exec/exec.h>
  18. #include <exec/execbase.h>
  19. #include <exec/memory.h>
  20. #include <dos/dosextens.h>
  21. #include <dos/rdargs.h>
  22. #include <dos/dostags.h>
  23. #include <string.h>
  24. #include <stdio.h>
  25. #include <ctype.h>
  26. #include <dos.h>
  27. #include <proto/dos.h>
  28. #include <proto/exec.h>
  29. #include <graphics/text.h>
  30.  
  31. // Gui4Cli.h include file (assuming it's in the include: dir)
  32. #include <Gui4Cli.h>
  33.  
  34. // prototype
  35. int sendmsg (UBYTE *, struct g4cmsg *);
  36.  
  37. // ==============================================================
  38. // MAIN - print the names of all loaded guis
  39. // ==============================================================
  40.  
  41. LONG main (void)
  42. {
  43.     struct Process *myself = (struct Process *)FindTask(NULL);
  44.     struct MsgPort *myport;
  45.  
  46.     struct g4cmsg  msg;    // the message we'll use
  47.     struct GCmain  *gc;    // Gui4Cli's main structure
  48.     struct guifile *gf;    // a gui file pointer
  49.     LONG   ret = 10;    // our return code
  50.       
  51.     // this is our proccess's message port
  52.     myport = &myself->pr_MsgPort;
  53.  
  54.     // clear & set up the message structure
  55.     memset ((char *)&msg, 0, sizeof(msg));
  56.     msg.node.mn_ReplyPort = myport;
  57.     msg.node.mn_Length = sizeof(struct g4cmsg);
  58.     msg.magic = 392001; // so that g4c recognises us
  59.     msg.type = GM_LOCK; // make it a lock message
  60.  
  61.     // send the message - a return of 0 means ok
  62.     // otherwise there was a failure and we exit indicating error
  63.     if (ret = sendmsg ("Gui4Cli", &msg)) return (ret);
  64.  
  65.     // The pointer to Gui4Cli's main structure, is in msg.gcmain
  66.     gc = msg.gcmain;
  67.  
  68.     // make sure that it's valid..
  69.     if (gc && (gc->magic == MM_G4C))
  70.     {
  71.         // print out the names of all the guis currently loaded
  72.         for (gf = gc->topguifile; gf; gf = gf->next)
  73.              Printf ("FILE: %s\n", gf->name);
  74.     }
  75.  
  76.     // *must* unlock Gui4Cli after we're through using it..
  77.     msg.type = GM_UNLOCK;
  78.     sendmsg ("Gui4Cli", &msg);
  79.  
  80.     // now for my next trick...
  81.     // we send a command to Gui4Cli to execute..
  82.     msg.com  = "SETVAR *GlobVar \'Some value\'";
  83.     msg.type = GM_COMMAND;
  84.     ret = sendmsg ("Gui4Cli", &msg);
  85.     // now global var *GlobVar will contain the words "Some value" 
  86.  
  87.     // that's all..
  88.     return (ret);
  89. }
  90.  
  91.  
  92. // ==============================================================
  93. // Send a message, wait for reply.. 
  94. // -->> return 0 for OK or error code otherwise
  95. // - portname = the name of Gui4Cli message port (usually Gui4Cli)
  96. // - msg = the message we received
  97. // ==============================================================
  98.  
  99. sendmsg (UBYTE *portname, struct g4cmsg *msg)
  100. {
  101.     struct MsgPort *gcport, *myport;
  102.     
  103.     // get a pointer to our message port (for code clarity)
  104.     myport = msg->node.mn_ReplyPort;
  105.  
  106.     Forbid();
  107.     if (gcport = FindPort(portname))
  108.     {
  109.        PutMsg (gcport, &msg->node);
  110.        Permit();
  111.        // wait for reply..
  112.        WaitPort (myport);
  113.        msg = (struct g4cmsg *)GetMsg (myport);
  114.        // return Gui4Cli's return code (probably 0 meaning OK)
  115.        return (msg->res);
  116.     }
  117.     Permit();
  118.     PutStr ("Could not find port!\n"); 
  119.     return (10);
  120. }
  121.  
  122.  
  123.  
  124.  
  125.